cache system design